#include <cmath>

#include "rvfft.hpp"
#include "instr_printer.hpp"
#include "shuffle.hpp"
#include "concat.hpp"

#define PRINT(instruction)  printer.add_instr(rvfft::instruction)

using std::cout, std::endl;

int main(int argc, char *argv[])
{
//    constexpr uint32_t L = 10;
//    mem32array<L> data_test,shuffle_data;
   
//     for(int i=0;i<512;i++){
//         data_test[i]=0x00100010;
//     }
//     for(int i=0;i<512;i++){
//         data_test[i+512]=0x00200020;
//     }
   
   
//    shuffle_data = shuffle<L>(data_test);
   
//    mem64array<L-1> shuffle_data64 = concat32x2<1<<L>(shuffle_data);
   
    // for(int i=0;i<2;i++){
    //  cout << "0b" << std::bitset<32>(shuffle_data[i]) << endl;
    // }
    // for(int i=0;i<2;i++){
    //  cout << "0b" << std::bitset<64>(shuffle_data64[i]) << endl;
    // }
   
   
   
   InstrPrinter printer("/data/jsj/proj/nexus-am/apps/microbench/include/fft_data.h");
//    int data[10]={1};
//    int offset = 0;

    // base addr stored in register t0
    printer.add_line("void load_data1024(){");
    printer.add_line("__asm__ volatile(");
    printer.add_line("\"nop \\n\\t\\");
    

    
    for(int i=0;i<512;i++){
    printer.add_line("li", "t0", std::to_string(16*i));
    printer.add_line("li", "t1", std::to_string(0x0020002000100010));
    printer.add_line("sd", "t1", std::to_string(0), "t0");
    }


    printer.add_line("nop\"");
    printer.add_line(");");
    printer.add_line("}");
    return 0;
}

